Language Server
from LSP
プログラムのコードを解析して情報を提供する
ローカルに立てられるサーバー
コード検証はリソース負荷の高い処理
なのでクライアントとは別プロセスでサーバーを立てて行う
各言語ごとに実装が必要
何が嬉しいのか
Language ServerがサポートされたIDEでは、
型やプロパティなどの自動補完
変数、関数、プロパティなどの定義参照
変数、関数などが利用されている場所の検索
コードのフォーマット
エラー分析、修正案の提示
などができる
言語サーバー自体はどの言語で実装されていてもいい
まぁ普通に考えれば、言語Aの言語サーバーはAで書くのが楽だと思うが
LSPに則っていればやり取りできる
クライアントはIDEに依存する?
例えばVSCodeならTypeScriptかJSじゃないといけない?
1つのIDEで複数のサーバーを使うことができる
例えばVSCodeの一つのワークスペースででNimとTypeScriptのファイルを開くと
Nim用とTypeScript用の2つの言語サーバーが起動する
結局こいつは何をやってるんだ?
https://github.com/Microsoft/vscode-extension-samples/blob/master/lsp-sample/server/src/server.ts
コード例
Language Serverを自作したい
誰が作る?
IDEの開発元?
言語の開発元?
誰でも作れる?
これ
Language Serverがもっと具体的にどう解析してるのかを知りたいな
仕組み
go to definitionとかどうやって特定してるの?
普通のコンパイラと何処が同じで何処が違うのか
実装例
一覧
https://langserver.org/
Emacs
https://github.com/emacs-lsp/lsp-mode
https://blog.takuchalle.dev/post/2018/12/11/emacs_lsp_mode/
「EmacsでLSPを使えるパッケージ」って言い方に違和感があるが
言語サーバーが複数あるものもあるのか?
使える機能がちょっと違うとか?
rust
RLS
Python
https://github.com/microsoft/python-language-server
vim
vim-lsp
TypeScript
開発時からlanguage serverの利用を意図しながら設計された
が、一応非公式で2つの実装がある
https://github.com/sourcegraph/javascript-typescript-langserver
https://github.com/theia-ide/typescript-language-server
が、各々問題があるのでTS team頑張れみたいなことを言っている人もいる ref
Scala
Metals
Go
gopls
公式
bingo
https://speakerdeck.com/lighttiger2505/go-language-server-shi-ubesi
Swift
https://www.infoq.com/jp/news/2018/12/swift-language-server-protocol/
C#
OmniSharp
Elm
https://qiita.com/Cj-bc/items/9cfcf85e8701c38183a7
R
https://marketplace.visualstudio.com/items?itemName=REditorSupport.r-lsp
OCaml
https://marketplace.visualstudio.com/items?itemName=raiscui.reasonml-wsl
Haskell
https://marketplace.visualstudio.com/items?itemName=alanz.vscode-hie-server
php
https://github.com/felixfbecker/php-language-server
https://github.com/Microsoft/tolerant-php-parser